package com.beauty.payment.service;

import com.beauty.payment.dto.PaymentResponse;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 支付服务接口
 */
public interface PaymentService {
    
    /**
     * 记录支付请求
     * @param orderNumber 订单号
     * @param amount 支付金额
     * @param paymentMethod 支付方式
     * @return 支付记录ID
     */
    Long recordPaymentRequest(String orderNumber, BigDecimal amount, String paymentMethod);
    
    /**
     * 处理支付成功
     * @param orderNumber 订单号
     * @param tradeNo 第三方支付单号
     * @param amount 实际支付金额
     * @param paymentMethod 支付方式
     * @return 是否处理成功
     */
    boolean handlePaymentSuccess(String orderNumber, String tradeNo, BigDecimal amount, String paymentMethod);
    
    /**
     * 检查订单是否已支付
     * @param orderNumber 订单号
     * @return 是否已支付
     */
    boolean isOrderPaid(String orderNumber);
    
    /**
     * 关闭支付
     * @param orderNumber 订单号
     * @return 是否成功关闭
     */
    boolean closePayment(String orderNumber);
    
    /**
     * 验证支付宝回调签名
     * @param params 参数
     * @return 是否验证通过
     */
    boolean verifyAlipaySign(Map<String, String> params);
    
    /**
     * 根据订单ID获取支付记录列表
     * @param orderId 订单ID
     * @return 支付记录列表
     */
    List<PaymentResponse> getPaymentsByOrderId(String orderId);
    
    /**
     * 根据支付ID获取支付记录
     * @param id 支付ID
     * @return 支付记录
     */
    PaymentResponse getPaymentById(Long id);
    
    /**
     * 创建支付
     * @param paymentRequest 支付请求
     * @return 支付响应
     */
    PaymentResponse createPayment(com.beauty.payment.dto.PaymentRequest paymentRequest);
    
    /**
     * 根据客户ID获取支付记录列表
     * @param customerId 客户ID
     * @return 支付记录列表
     */
    List<PaymentResponse> getPaymentsByCustomerId(String customerId);
    
    /**
     * 获取所有支付记录
     * @return 支付记录列表
     */
    List<PaymentResponse> getAllPayments();
    
    /**
     * 更新支付状态
     * @param id 支付ID
     * @param status 支付状态
     * @return 更新后的支付记录
     */
    PaymentResponse updatePaymentStatus(Long id, com.beauty.payment.entity.Payment.PaymentStatus status);
    
    /**
     * 删除支付记录
     * @param id 支付ID
     */
    void deletePayment(Long id);
} 